home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / post2_g2 / src / p_fuku.c < prev    next >
Text File  |  1997-10-13  |  5KB  |  207 lines

  1. /*
  2.     post / 郵便番号検索プログラム
  3.  
  4.     p_fuku.c / 複数候補検査部
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <conio.h>
  11. #include <unistd.h>
  12. #include "post.h"
  13.  
  14.  
  15. /*
  16.     複数可能性チェック
  17. */
  18. void
  19. check_kanousei( int shiku_num[5] )
  20. {
  21.     int    i1=0, i2=0,    /* ループ汎用 */
  22.         ichi[ 16 ],    /* デリミタ発見位置 */
  23.         last_pos = 0,    /* 最終位置を持つ */
  24.         s_num = 0,    /* 候補選択用 */
  25.         ctr = 0,    /* スケジュール・カウンタ */
  26.         find_ku = 0,    /* 市内区発見スイッチ */
  27.         len_str = 0;    /* 文字列長さ */
  28.  
  29.     int    delim1[ 32 ],    /* デリミタ格納用 */
  30.         delim2[ 32 ];
  31.  
  32.     uchar    strwk1[ 32 ][ 33 ],    /* 文字列の候補 */
  33.         strwk2[ 32 ][ 33 ];
  34.  
  35.     uchar    sbuf[8];    /* 候補選択用 */
  36.     uchar    numbuff[12];
  37.  
  38.  
  39.     /* 初期化 */
  40.     sbuf[ 0 ] = '\0';
  41.  
  42.     for( i1=0; i1<=15; i1++ ) {
  43.         ichi[ i1 ] = -1;
  44.     }
  45.  
  46.     for( i1=0; i1<=31; i1++ ) {
  47.         strwk1[ i1 ][ 0 ] = '\0';
  48.         strwk2[ i1 ][ 0 ] = '\0';
  49.  
  50.         delim1[ i1 ] = -1;
  51.         delim2[ i1 ] = -1;
  52.     }
  53.  
  54.     /* 位置関係表を作る */
  55.     len_str = strlen( input_str );
  56.     last_pos = len_str / 2 - 1;    /* 最終位置をセット */
  57.  
  58.     for( i1=1; i1<=last_pos; i1++ ) {
  59.         /* 1からなのは、先頭は検査する必要がないから */
  60.  
  61.         for( i2=0; i2<=4; i2++ ) {    /* 各デリミタごと */
  62.  
  63.             if( (input_str[ i1*2   ] == kanji_shiku[ i2 ][ 0 ]) &&
  64.                 (input_str[ i1*2+1 ] == kanji_shiku[ i2 ][ 1 ]) ) {
  65.                 ichi[ i1 ] = i2;
  66.             }
  67.         }
  68.     }
  69.  
  70.     /* 位置関係表をもとに検証 */
  71.  
  72.     for( i1=1; i1<=last_pos; i1++ ) {
  73.  
  74.         if( ichi[ i1 ] == -1 ) {    /* 何も入っていない */
  75.  
  76.             continue;
  77.  
  78.         } else if( ichi[ i1 ] == 2 ) {    /* 郡 */
  79.  
  80.             if( (i1 != last_pos) && (i1 != last_pos-1) ) {    /* 最終位置でない */
  81.                 str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
  82.                 for( i2=i1+2; i2<=last_pos; i2++ ) {    /* 後ろを検査 */
  83.                     if( (ichi[ i2 ] == 3) ||    /* 町村があれば */
  84.                         (ichi[ i2 ] == 4) ) {
  85.                         str_bcpy( strwk2[ ctr ], (i1+1)*2, i2*2+1 );
  86.                         if( sonzai_check( strwk1[ ctr ],strwk2[ ctr ],
  87.                                     2, ichi[ i2 ] )) {
  88.                             delim1[ ctr ] = 2;    /* 郡 */
  89.                             delim2[ ctr ] = ichi[ i2 ];
  90.                             ctr++;    /* 進める=候補に取り込む */
  91.                             break;    /* i2のforを進める */
  92.                         }
  93.                     }
  94.                 }
  95.             }
  96.         } else if( ichi[ i1 ] == 0 ) {    /* 市 */
  97.  
  98.             str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
  99.  
  100.             if( (i1 == last_pos) || (i1 == last_pos-1) ) {    /* 最終位置なら */
  101.  
  102.                 if( sonzai_check( strwk1[ctr], NULL, 0, -1 ) ) {
  103.  
  104.                     delim1[ ctr ] = 0;    /* 市 */
  105.  
  106.                     strwk2[ ctr ][0] = '\0';    /* 念のため */
  107.                     delim2[ ctr ] = -1;
  108.                     ctr++;
  109.                 }
  110.             } else {    /* 最終位置でない */
  111.  
  112.                 /* 市内区を探す */
  113.                 for( i2=i1+2; i2<=last_pos; i2++ ) {
  114.                     if( ichi[i2] == 1 ) {     /* 市内区がある? */
  115.  
  116.                         str_bcpy( strwk2[ ctr ], (i1+1)*2, i2*2+1 );
  117.  
  118.                         if( sonzai_check( strwk1[ctr], strwk2[ctr],
  119.                                     0, 5 )) {
  120.                             delim1[ ctr ] = 0;
  121.                             delim2[ ctr ] = 1;
  122.                             ctr++;
  123.                             find_ku = 1;
  124.                             break;    /* i2のforを進める */
  125.                         }
  126.                     }
  127.                 }
  128.                 if( find_ku == 0 ) {
  129.                     if( sonzai_check( strwk1[ctr], NULL, 0, -1 ) ) {
  130.                         delim1[ ctr ] = 0;
  131.  
  132.                         strwk2[ ctr ][0] = '\0';    /* 念のため */
  133.                         delim2[ ctr ] = -1;
  134.                         ctr++;
  135.                     }
  136.                 }
  137.             }
  138.  
  139.         } else if( ichi[ i1 ] == 1 ) {    /* 区 */
  140.  
  141.             if( (todo_sw) && (num_pref != 12) ) {    /* 東京都でなければ */
  142.                 continue;
  143.             } else {
  144.                 str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
  145.                 if( sonzai_check( strwk1[ctr], NULL, 1, -1 ) ) {
  146.                     delim1[ ctr ] = 1;
  147.  
  148.                     strwk2[ ctr ][0] = '\0';    /* 念のため */
  149.                     delim2[ ctr ] = -1;
  150.                     ctr++;
  151.                 }
  152.             }
  153.  
  154.         } else if( (ichi[ i1 ] == 3) || (ichi[ i1 ] == 4) ) {    /* 町・村 */
  155.  
  156.             str_bcpy( strwk1[ ctr ], 0, i1*2+1 );
  157.  
  158.             if( sonzai_check( strwk1[ctr], NULL, ichi[ i1 ], -1 ) ) {
  159.                 delim1[ ctr ] = ichi[ i1 ];
  160.  
  161.                 strwk2[ ctr ][0] = '\0';    /* 念のため */
  162.                 delim2[ ctr ] = -1;
  163.                 ctr++;
  164.             }
  165.         }
  166.     } /* for終端 */
  167.  
  168.     ctr--;        /* 調整 */
  169.  
  170.     if( ctr == -1 ) {
  171.  
  172.         puts("警告 401 : 入力された住所からは、郵便番号が検索できませんでした。");
  173.         return;
  174.  
  175.     } else if( ctr == 0 ) {
  176.  
  177.         /* cut_checkする */
  178.         cut_check( delim1[ 0 ], delim2[ 0 ] );
  179.  
  180.     } else {
  181.         /* えらんでもらう */
  182.         printf("解析の結果、次のような候補を検索することができました。\n");
  183.         printf("希望する正しい住所を選択して下さい。\n");
  184.  
  185.         do {
  186.             for( i1=0; i1<=ctr; i1++ ) {
  187.                 printf("%2d : %s|%s|%s\n", i1+1, strwk1[i1], strwk2[i1],
  188.                             nokori( strwk1[i1], strwk2[i1] ) );
  189.             }
  190.  
  191.             printf("1 から %2d までの数字で選択して下さい :",ctr+1);
  192.  
  193.             scanf( "%2s", numbuff );
  194.             s_num = atoi( numbuff );
  195.  
  196.         } while ( (s_num < 1) || (s_num > ctr+1) );
  197.         printf("\n");
  198.  
  199.         s_num--;
  200.  
  201.         /* cut_checkする */
  202.         cut_check( delim1[ s_num ], delim2[ s_num ] );
  203.     }
  204.  
  205.     return;
  206. }
  207.